#include "myclientsocket.h"
#include <QHostAddress>
#include <QJsonObject>
#include <QJsonDocument>
#include <QDebug>
#include "stdshared.h"

MyClientSocket::MyClientSocket(QObject *parent) : QObject(parent)
{
    m_socket = new QTcpSocket(this);

    // 连接服务器成功后的处理
    connect(m_socket, &QTcpSocket::connected, this, [ = ]()
    {
        // 创建 JSON 对象
        QJsonObject jsonObj;
        // 设置<key:value>属性
        jsonObj["gamer"] = "123456";
        jsonObj["msg"] = "123456";
        jsonObj["rival"] = "000";

        // 将 JSON 对象转换为 JSON 字符串进行传输
        QJsonDocument document(jsonObj);

        // 发送数据
        writeBytes(document.toJson());
        qDebug() << "连接服务器成功";
    });

    // 连接数据接收信号
    connect(m_socket, &QTcpSocket::readyRead, this, &MyClientSocket::handleReadSlot);
}

void MyClientSocket::connectServer(const QString &ip, int port)
{
    // 连接到服务器
    m_socket->connectToHost(QHostAddress(ip), port);
    m_ip = ip;
    m_port = port;
}

int MyClientSocket::writeBytes(const QByteArray &data)
{
    // 发送数据包头
    size_t dataSize = data.size();
    m_socket->write(reinterpret_cast<const char*>(&dataSize), sizeof(size_t));

    // 发送数据本身
    return m_socket->write(data);
}

void MyClientSocket::handleReadSlot()
{
    qDebug() << "准备接收数据";

    // 读取数据的包头
    m_buffer.append(m_socket->readAll());

    // 处理接收到的数据
    while (m_buffer.size() >= sizeof(size_t))
    {
        size_t size;
        memcpy(&size, m_buffer.data(), sizeof(size_t));

        // 如果缓冲区数据还不足以构成一个完整的数据包，退出循环等待更多数据
        if (m_buffer.size() < size + sizeof(size_t))
        {
            break;
        }

        // 解析出数据并发射信号
        emit dataRecv(m_buffer.mid(sizeof(size_t), size));

        // 从缓冲区移除已经处理的部分
        m_buffer.remove(0, sizeof(size_t) + size);
    }
}
